Panic Error „range end index 4 out of range“ nach Vaultwarden Update – gelöst

Ich hab Vaultwarden auf meinem Server aktualisiert – von 1.33.2-alpine auf 1.34.2-alpine. Wie immer: docker compose pull, dann up -d, fertig.

Im gleichen Zug habe ich auch den MySQL-Container aktualisiert. Ich nutze das Image mysql:8 und habe auf die Version 8.4.6 aktualisiert. Welche Version vorher lief, weiß ich leider nicht genau – aber es war auf jeden Fall ebenfalls ein 8er-Release. Eigentlich also ein recht harmloses Update… sollte man meinen.

Vaultwarden startete danach ganz normal. Die Login-Seite war erreichbar, und ich konnte meine E-Mail-Adresse eingeben. Soweit, so gut – dachte ich.

Doch nach der Eingabe des Passworts im Webinterface knallte es richtig:

[2025-07-27 22:09:38.912][panic][ERROR] thread 'rocket-worker-thread' panicked at 'range end index 4 out of range for slice of length 0':
/root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/diesel-2.2.12/src/mysql/value.rs:69
   0: vaultwarden::init_logging::{{closure}}
   1: std::panicking::rust_panic_with_hook
   2: std::panicking::begin_panic_handler::{{closure}}
   3: std::sys::backtrace::__rust_end_short_backtrace
   4: __rustc::rust_begin_unwind
   5: core::panicking::panic_fmt
   6: core::slice::index::slice_end_index_len_fail::do_panic::runtime
   7: core::slice::index::slice_end_index_len_fail
   8: diesel::mysql::value::MysqlValue::numeric_value
   9: diesel::mysql::types::primitives::<impl diesel::deserialize::FromSql<
        diesel::sql_types::Integer,
        diesel::mysql::backend::Mysql
      > for i32>::from_sql
  10: <T as diesel::deserialize::FromStaticSqlRow<ST, DB>>::build_from_row
  11: <diesel::query_dsl::load_dsl::private::LoadIter<U, C, ST, DB> as core::iter::traits::iterator::Iterator>::next
  12: core::iter::traits::iterator::Iterator::collect
  13: vaultwarden::db::models::cipher::Cipher::find_by_user::{{closure}}::{{closure}}
  14: vaultwarden::db::models::cipher::Cipher::find_by_user::{{closure}}
  15: vaultwarden::db::models::cipher::Cipher::find_by_user_visible::{{closure}}
  16: vaultwarden::api::core::ciphers::sync::into_info::monomorphized_function::{{closure}}
  17: rocket::server::<impl rocket::rkt::Rocket<rocket::phase::Orbit>>::route::{{closure}}
  18: rocket::server::hyper_service_fn::{{closure}}::{{closure}}
  19: tokio::runtime::task::raw::poll
  20: tokio::runtime::scheduler::multi_thread::worker::Context::run_task
  21: tokio::runtime::scheduler::multi_thread::worker::run
  22: tokio::runtime::task::raw::poll
  23: std::sys::backtrace::__rust_begin_short_backtrace
  24: core::ops::function::FnOnce::call_once{{vtable.shim}}
  25: std::sys::pal::unix::thread::Thread::new::thread_start

🧪 Symptome: Merkwürdiges Verhalten auch bei Browser & App

Parallel zur Weboberfläche habe ich auch die Browser-Erweiterung getestet – und da war ebenfalls einiges kaputt. Normalerweise bleibe ich dort eingeloggt, aber diesmal wurde ich direkt ausgeloggt. Der erneute Login klappte zwar, aber danach war mein Tresor komplett leer. Kein einziger Eintrag zu sehen – was ehrlich gesagt schon ziemlich beunruhigend war.

Komisch war nur: Die Windows-App funktionierte weiterhin ganz normal. Ich konnte mich einloggen und alles war da. Das Verhalten war also nicht nur inkonsistent – es war richtig irreführend. Und das machte die Fehlersuche umso schwieriger.

🔍 Ursache: Ein unscheinbares Feld mit großer Wirkung

Nach etwas Recherche bin ich in einer GitHub-Diskussion (Vaultwarden #5959) auf genau meinen Fehler gestoßen. Dort wird beschrieben, dass in der Tabelle ciphers das Feld reprompt bei manchen Einträgen NULL sein kann. Vaultwarden erwartet dort aber zwingend einen Integer – ist NULL drin, scheitert die Deserialisierung durch die Rust-Library diesel mit einem Panic Error.

In meinem Fall war genau das die Ursache – und ließ sich mit einem SQL-Statement sauber beheben.

Es lohnt sich aber zu erwähnen:
In der Diskussion wird auch auf weitere mögliche Ursachen hingewiesen. Dazu gehören z. B.:

  • Nicht vollständig durchgeführte Schema-Änderungen
  • Falsche Zeichencodierung (Charset) oder Collation

Wenn du also ein ähnliches Fehlerbild hast, aber reprompt bei dir korrekt gesetzt ist, dann solltest du dir zusätzlich die Datenbank-Collation und -Charset anschauen. Die Vaultwarden-Doku enthält dazu auch einen passenden Abschnitt:
🔗 MySQL Backend – Charset und Collation prüfen

Außerdem wichtig: Das Problem scheint vor allem Alpine-/musl-basierte Vaultwarden-Images zu betreffen. Wer ein Debian-basiertes Image verwendet, ist nach aktuellem Stand nicht betroffen. Auch der Entwickler selbst hat sich bereits dazu geäußert und angekündigt, das Verhalten gezielt zu reproduzieren und in den musl-Builds zu fixen. (Stand: 28.07.2025)

🧯 Die Lösung: Ein einzelnes SQL-Statement

Mein erster Gedanke war: Ich logge mich in den MySQL-Container ein und repariere das per Hand. Gesagt, getan… dachte ich. Ich habe versucht, mich mit dem vaultwarden-Benutzer anzumelden – aber das schlug fehl mit der Fehlermeldung:

ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded

Also hab ich’s mit dem root-Benutzer versucht – und siehe da: das klappte sofort. Manchmal ist der Vorschlaghammer halt doch die beste Lösung.

In der MySQL-Konsole hab ich meine Vaultwarden-Datenbank ausgewählt:

SHOW DATABASES;
USE vaultwarden;

Dann habe ich die NULL-Werte in der Spalte reprompt auf 0 gesetzt:

UPDATE `ciphers` SET `reprompt` = 0 WHERE `reprompt` IS NULL;

Ein schneller Check mit SELECT ROW_COUNT(); zeigte mir, dass tatsächlich mehrere Zeilen betroffen waren. Anschließend habe ich den Login erneut ausprobiert – und siehe da: Der Login im Webinterface funktionierte wieder wie gewohnt. Auch die Browser-Erweiterung zeigte wieder meine Einträge, und alles war an seinem Platz.

✅ Fazit

Das hier ist mal wieder ein gutes Beispiel dafür, warum man Tools nicht einfach automatisch updaten lassen sollte – zumindest nicht blind. In meinem Fall zählt Vaultwarden ganz klar zur kritischen Infrastruktur. Wenn dieses Update still im Hintergrund gelaufen wäre, hätte ich den Fehler wahrscheinlich gar nicht mitbekommen – bis irgendwann die ersten Rückmeldungen gekommen wären, dass Logins nicht mehr funktionieren.

Automatisierung ist praktisch, keine Frage. Aber gerade bei sicherheitsrelevanten Anwendungen sollte man immer nochmal selbst einen Blick drauf werfen. Ein kurzer Check nach dem Update kostet fast nichts – kann aber eine Menge Frust ersparen.

👥 Techniverse Community

Matrix, Selfhosting, smarte IT-Lösungen und jede Menge Nerd-Talk – das findest du in der Techniverse Community.
Komm vorbei, tausch dich aus und werde ein Teil von uns.
👉 Unsere Gruppe auf Matrix: #community:techniverse.net
Wir freuen uns auf dich!

Vielen Dank fürs Teilen!